home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / ebsx130 / seion.c < prev    next >
Text File  |  1996-05-01  |  3KB  |  108 lines

  1. #include "common.h"
  2.  
  3. #include <iocslib.h>
  4. #include <jctype.h>
  5.  
  6. /* shift-JIS を、清音の JIS コードに変換する */
  7. /*  err があったら、NULL を返す             */
  8. jischar* seion(char *str, jischar *outp, size_l length)
  9. {
  10.     unsigned char    c,fc;
  11.     int    ch;
  12.     char    *s=str;
  13.     jischar    *p=outp;
  14.  
  15.     alpha = 0;    /* kenji suzuki */
  16.     fc=0;
  17.     while (c=*s++) {
  18.         if ((ch=AKCONV(0,c))<0) {
  19.             if (iskanji(c)) {
  20.                 ch=c<<8;
  21.                 c=*s++;
  22.                 if (iskanji2(c)) {
  23.                     ch+=c;
  24.                 }
  25.             } else return NULL;
  26.         }
  27.         ch=SFTJIS(ch);
  28.         if (ch==0x212b||ch==0x212c) continue;
  29.         if ((ch&0xff00)==0x2500) ch&=0x24ff;  /* 片仮名を平仮名にする */
  30.         if ((ch&0xffe0)==0x2360) ch&=0x235f;  /* 英小文字を大文字化 */
  31.         if (ch==0x213c||ch==0x213d||ch==0x215d) {
  32.             if (fc==0) return NULL;
  33.             switch (fc) {
  34.                 case 0x22: case 0x2b: case 0x35: case 0x3f: case 0x4a:
  35.                 case 0x4f: case 0x5e: case 0x64: case 0x69: case 0x6f:
  36.                     ch=0x2422; break; /* あ行 */
  37.                 case 0x24: case 0x2d: case 0x37: case 0x41: case 0x4b:
  38.                 case 0x52: case 0x5f:            case 0x6a: case 0x70:
  39.                     ch=0x2424; break; /* い行 */
  40.                 case 0x26: case 0x2f: case 0x39: case 0x44: case 0x4c:
  41.                 case 0x55: case 0x60: case 0x66: case 0x6b:
  42.                     ch=0x2426; break; /* う行 */
  43.                 case 0x28: case 0x31: case 0x3b: case 0x46: case 0x4d:
  44.                 case 0x58: case 0x61:            case 0x6c: case 0x71:
  45.                     ch=0x2428; break; /* え行 */
  46.                 case 0x2a: case 0x33: case 0x3d: case 0x48: case 0x4e:
  47.                 case 0x5b: case 0x62: case 0x68: case 0x6d: case 0x72:
  48.                     ch=0x242a; break; /* お行 */
  49.                 default: return NULL;
  50.             }
  51.         } else {
  52.             fc=0;
  53. /* kenji suzuki */    if(( ch >= 0x2341 ) && ( ch <= 0x235a ))
  54.             {
  55.                 alpha = 1;
  56.             };
  57.  
  58.             if ((ch&0xff00)==0x2400) {
  59.                 c=ch;
  60.                 switch (c) {
  61.                     /* ぁ ぃ ぅ ぇ ぉ */
  62.                     case 0x21: case 0x23: case 0x25: case 0x27: case 0x29:
  63.                     /* っ ゃ ゅ ょ ゎ  以上を大文字にする */
  64.                     case 0x43: case 0x63: case 0x65: case 0x67: case 0x6e:
  65.                         ch++; break;
  66.                     case 0x2c: case 0x2e: case 0x30: case 0x32: case 0x34:
  67.                     case 0x36: case 0x38: case 0x3a: case 0x3c: case 0x3e:
  68.                     case 0x40: case 0x42: case 0x45: case 0x47: case 0x49:
  69.                     case 0x50: case 0x53: case 0x56: case 0x59: case 0x5c:
  70.                         ch--; break;  /* 濁点を取る */
  71.                     case 0x51: case 0x54: case 0x57: case 0x5a: case 0x5d:
  72.                         ch-=2; break; /* 半濁点を取る */
  73.                     case 0x75: ch=0x242b; break;
  74.                     case 0x76: ch=0x2431; break;
  75. /* kenji suzuki */            case 0x74: ch=0x2426; break;    /* ヴ->う */
  76.                 }
  77.                 fc=ch;
  78.             }
  79.             c=ch>>8;
  80. /*            if ((ch&0xffc0)!=0x2340 && c!=0x24 && c<0x30 && ch!=0x213a)    */
  81. /* kenji suzuki */    if ((ch&0xffc0)!=0x2340 && c!=0x24 && c<0x30 && ch!=0x213a && ch!=0x2121)
  82.                 return NULL;
  83.         }
  84.         /* *p++=JISSFT(ch); */
  85.         *p++=ch;
  86.     }
  87.     *p++=0;
  88. /*    p=outp;
  89.     while (ch=*p++) {
  90.         ch=JISSFT(ch);
  91.         putchar(ch>>8); putchar(ch);
  92.         putchar('\n');
  93.     }
  94. */    return outp;
  95. }
  96.  
  97. /*
  98. #include <stdio.h>
  99. int main(int argc, char *argv[])
  100. {
  101.     char    out[10000];
  102.     char    *p;
  103.     p=seion(argv[1],out,sizeof(out));
  104.     if (p==NULL) p="(NULL)";
  105.     puts(p);
  106. }
  107. */
  108.